package com.bnz.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//定义通知
@Aspect
@Component
public class MyAdvice2 {
    /**
     * 前置通知(Before)：是调用方法之前调用
     * 后置通知(AfterReturning)：在调用方法之后调用（出现异常不调用 ）
     * 环绕通知(Around):在调用方法的前后，都会执行
     * 异常通知(After-Throwing):在方法调用出现异常时执行
     * 后置通知(After):无论是否出现异常都会调用
     */
    // 1. 定义切入点表达式
    @Pointcut("execution(* com.bnz.dao.impl.*DaoImpl.*(..))")
    // 2. 配置通知
    public void pc(){

    }

    @Before("pc()")
    public void before(){
        System.out.println("前置通知！");
    }

    @AfterReturning("pc()")
    public void afterReturning(){
        System.out.println("后置通知，出现异常不调用！");
    }

    @AfterThrowing("pc()")
    public void afterThrowing(){
        System.out.println("后置通知，出了异常调用！");
    }

    @After("pc()")
    public void after(){
        System.out.println("后置通知，无论是否出现异常，都会调用！");
    }

    @Around("pc()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕通知-前面代码");
        Object proceed = pjp.proceed();
        System.out.println("环绕通知-后面代码");
        return proceed;
    }
}